/**
 * Copyright 1996 self.com.au
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License. (http://www.apache.org/licenses/LICENSE-2.0)
 *
 * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed 
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for 
 * the specific language governing permissions and limitations under the License.
 *
 * <dhamma-message src="Atisha (11th century Tibetan Buddhist master)">
 * 	The greatest achievement is selflessness. The greatest worth is self-mastery.
 * 	The greatest quality is seeking to serve others. The greatest precept is continual awareness.
 * 	The greatest medicine is the emptiness of everything. The greatest action is not conforming with the worlds ways.
 * 	The greatest magic is transmuting the passions. The greatest generosity is non-attachment.
 * 	The greatest goodness is a peaceful mind. The greatest patience is humility.
 * 	The greatest effort is not concerned with results. The greatest meditation is a mind that lets go.
 * 	The greatest wisdom is seeing through appearances. 
 * </dhamma-message>
 *
 * @author Ashin Wimalajeewa
 *
 * Note, this is a very old runtime library that I have evolved since 1996. I rarely use it
 * now because the Apache Commons project has made it obsolete.
 */
package self.lang;

import java.net.InetAddress;
import java.security.SecureRandom;

final public class UidUtils {
  final static private WoodcockUid wcUid = new WoodcockUid();

  private UidUtils() {
  	// private constructor to stop instantiation.
  }

  static public String getRmiGuid() {
    try {
      String guid = InetAddress.getLocalHost().getHostAddress() + ":" +
                      (new java.rmi.server.UID()).toString();
      return guid;
    } catch ( Exception err ) {
      throw new IllegalStateException( err.getMessage() );
    }
  }

  static public String getNwgGuid() {
    return wcUid.getUUID();
  }

  static public class WoodcockUid {
    private SecureRandom seeder;
    private String midValue;

    public WoodcockUid() {
      try {
        final StringBuffer stringbuffer = new StringBuffer();
        seeder = new SecureRandom();
        InetAddress inetaddress = InetAddress.getLocalHost();
        String s = hexFormat(inetaddress.hashCode(), 8);
        String s1 = hexFormat(hashCode(), 8);
        stringbuffer.append("-");
        stringbuffer.append(s.substring(0, 4));
        stringbuffer.append("-");
        stringbuffer.append(s.substring(4));
        stringbuffer.append("-");
        stringbuffer.append(s1.substring(0, 4));
        stringbuffer.append("-");
        stringbuffer.append(s1.substring(4));
        midValue = stringbuffer.toString();
        seeder.nextInt(); // TODO WilliamF 14-JUN-2005 Why are we getting and ignoring #nextInt here?
      } catch( Exception exception ) {
          throw new IllegalStateException( exception.getMessage() );
      }
    }

    public String getUUID() {
      long l = System.currentTimeMillis();
      int i = (int)l & -1;
      int j = seeder.nextInt();
      return hexFormat(i, 8) + midValue + hexFormat(j, 8);
    }

    static private String hexFormat( int val, int strSz ) {
      String hex = Integer.toHexString( val );
      StringBuffer buff = new StringBuffer( hex );
      int max = strSz - hex.length();
      for ( int cntr = 0; cntr < max; cntr++ )
        buff.insert( 0, '0' );
      return buff.toString();
    }
  }
}